package parser

import 

//NodeType enumerations
const (
	Empty lexer.XItemType = ""
)

//Node builds an AST tree for operating on XPath expressions
type Node struct {
	Val    lexer.XItem
	Left   *Node
	Right  *Node
	Parent *Node
	next   *Node
}

var beginPathType = map[lexer.XItemType]bool{
	lexer.XItemAbsLocPath:     true,
	lexer.XItemAbbrAbsLocPath: true,
	lexer.XItemAbbrRelLocPath: true,
	lexer.XItemRelLocPath:     true,
	lexer.XItemFunction:       true,
}

func ( *Node) ( lexer.XItem) {
	if .Val.Typ == Empty {
		.Val = 
	} else if .Left == nil && .Right == nil {
		.Left = &Node{Val: .Val, Parent: }
		.Val = 
	} else if beginPathType[.Val.Typ] {
		 := &Node{Val: .Val, Left: .Left, Right: .Right, Parent: }
		.Left, .Right = , nil
		.Val = 
	} else if .Right == nil {
		.Right = &Node{Val: , Parent: }
	} else {
		 := &Node{Val: .Val, Left: .Left, Right: .Right, Parent: }
		.Left, .Right = , nil
		.Val = 
	}
	.next = 
}

func ( *Node) ( lexer.XItem) {
	if .Left == nil {
		.Left = &Node{Val: , Parent: }
		.next = .Left
	} else if .Right == nil {
		.Right = &Node{Val: , Parent: }
		.next = .Right
	} else {
		 := &Node{Val: , Left: .Right, Parent: }
		.Right = 
		.next = .Right
	}
}

func ( *Node) ( lexer.XItem) {
	if .Val.Typ == Empty {
		.add()
	} else {
		.push()
	}
}

/*
func (n *Node) prettyPrint(depth, width int) {
	nodes := []*Node{}
	n.getLine(depth, &nodes)
	fmt.Printf("%*s", (width-depth)*2, "")
	toggle := true
	if len(nodes) > 1 {
		for _, i := range nodes {
			if i != nil {
				if toggle {
					fmt.Print("/   ")
				} else {
					fmt.Print("\\   ")
				}
			}
			toggle = !toggle
		}
		fmt.Println()
		fmt.Printf("%*s", (width-depth)*2, "")
	}
	for _, i := range nodes {
		if i != nil {
			fmt.Print(i.Val.Val, "   ")
		}
	}
	fmt.Println()
}

func (n *Node) getLine(depth int, ret *[]*Node) {
	if depth <= 0 && n != nil {
		*ret = append(*ret, n)
		return
	}
	if n.Left != nil {
		n.Left.getLine(depth-1, ret)
	} else if depth-1 <= 0 {
		*ret = append(*ret, nil)
	}
	if n.Right != nil {
		n.Right.getLine(depth-1, ret)
	} else if depth-1 <= 0 {
		*ret = append(*ret, nil)
	}
}
*/